/*****************************************************************************//** 
 *  \brief     
 *  \author    
 *  \version   
 *  \date      
 *  \copyright
 *	\notes
******************************************************************************/
/*** Header Guard ************************************************************/
#ifndef NARCHIVE_H
#define NARCHIVE_H
/*** Includes *****************************************************************/
/*** Forward Declarations *****************************************************/
namespace Core
{
	class NFile;
	class NSerializable;
}
/*** Namespace ****************************************************************/
namespace Core
{
/*** Macros *******************************************************************/
/*** Constants ****************************************************************/
/*** Interface ****************************************************************//** 
 *  \brief     
 *  \details   
 ******************************************************************************/
class NArchive
{
public:
	/*
		\brief Status enum for file serialization operations
	*/
	enum STATUS
	{
		STATUS_FAILURE,
		STATUS_SUCCESS
	};

	static const unsigned int sVersion = 10000;	//!<

public:
	/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	NArchive(NFile& file);

	/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	virtual ~NArchive(void);

	/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (bool& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (int& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (unsigned int& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (float& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (double& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (const char* value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator << (NSerializable* obj);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (bool& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (int& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (unsigned int& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (float& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (double& value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (const char* value);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void operator >> (NSerializable* obj);

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void Open();

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	void Close();

		/**************************************************************************//** 
	*	\brief		
	*	\param		
	*	\return		
	******************************************************************************/
	unsigned int GetVersion();

private:
	unsigned int mVersion;			//!<
	NFile* mFile;					//!<
};

}
#endif //NARCHIVE_H